[PB Generic表][C++ SDK]批量查询多条记录

1. 接口说明

BatchGet,从数据库表中批量查询多条记录(example路径:examples/tcaplus/C++_pb2_asyncmode_simpletable/SingleOperation/batchget) 注意:

2. 版本要求

无版本要求

3. 准备工作

参见准备工作文档,完成使用该接口前的准备工作,并创建如下PB Generic表,并使用PB工具转换为C++代码

syntax = "proto2";

        package myTcaplusTable;

        import "tcaplusservice.optionv1.proto";

        message tb_online {
        option(tcaplusservice.tcaplus_primary_key) = "openid,tconndid,timekey";

        required int32 openid = 1; //QQ Uin
        required int32 tconndid = 2;
        required string timekey = 3;
        required string gamesvrid = 4;
        optional int32 logintime = 5 [default = 1];
        repeated int64 lockid = 6 [packed = true]; //repeated类型字段使用packed关键字修饰
        optional pay_info pay = 7;

        message pay_info {
        optional uint64 total_money = 1;
        optional uint64 pay_times = 2;
        }
        }

准备工作完成后,将会获得以下信息,这些信息在使用SDK时会被用到:

  1. 目录服务器地址列表
  2. 业务ID
  3. 业务访问密码
  4. 游戏区ID
  5. 数据表名

4. 示例代码

4.1 异步调用示例代码

示例代码的基本执行过程:

  1. 定义表配置参数;
  2. 创建客户端;
  3. 定义回调函数,处理响应;
  4. 发送请求;
  5. example框架;

第1,2,5步是所有示例的通用代码,重点关注第3步和第4步,发送请求和响应处理的回调函数

4.1.1 定义数据库表配置参数(代码路径:examples/tcaplus/C++_common_for_pb/common.h)

主要设置表的相关配置参数,在代码文件的头部

// 目标业务的tcapdir地址
static const char DIR_URL_ARRAY[][TCAPLUS_MAX_STRING_LENGTH] =
{
   "tcp://10.191.***.99:9999"
};
// 目标业务的tcapdir 地址个数
static const int32_t DIR_URL_COUNT = 1;

// 目标业务的集群ID
static const int32_t APP_ID = 3;
// 目标业务的表格组ID
static const int32_t ZONE_ID = 1;
// 目标业务的业务密码
static const char * SIGNATURE = "*******";
// 目标业务的表名 tb_online
static const char * TABLE_NAME = "tb_online";

4.1.2 创建SDK客户端(代码路径:examples/tcaplus/C++_common_for_pb/common.h)

通过日志配置文件tlogconf.xml创建日志句柄,用于SDK的日志打印;通过该代码创建一个Tcaplus客户端,该客户端只允许单线程使用,多线程模型可以在每个线程上初始化一个客户端实例

//Tcaplus PB API客户端
TcaplusAsyncPbApi g_stAsyncApi;
int32_t InitAsyncPbApi()
{
    //PB API配置
    ClientOptions cfg;
    cfg.app_id = APP_ID;
    cfg.zones.push_back(ZONE_ID);
    strcpy(cfg.signature, SIGNATURE);
    for (int32_t i = 0; i < DIR_URL_COUNT; i++)
    {
        cfg.dirs.push_back(DIR_URL_ARRAY[i]);
    }
    //访问的PB表
    cfg.tables.push_back(TABLE_NAME);
    //日志配置
    strncpy(cfg.log_cfg, "tlogconf.xml", sizeof(cfg.log_cfg));
    //初始化连接超时时间5s
    cfg.timeout = 5000;

    //初始化连接
    int32_t iRet = g_stAsyncApi.Init(cfg);
    if (0 != iRet)
    {
        cout << "ERROR: g_stAsyncApi.Init failed, log cfg: " << cfg.log_cfg << ", iRet: " << iRet << "." << endl;
        return iRet;
    }
    return iRet;
}

4.1.3 定义回调函数,处理响应(代码路径:examples/tcaplus/C++_pb2_asyncmode_simpletable/SingleOperation/batchget/main.cpp)

class CommonCallback : public TcaplusPbCallback
{
public:
    CommonCallback()
    {
        cout << "Init CommonCallback." << endl;
    }

    ~CommonCallback() 
    {
        cout << "Fini ~CommonCallback." << endl;
    }

    int OnRecv(const std::map< ::google::protobuf::Message *, int> &msgs)
    {
        cout << "OnRecv[" << msgs.size() << endl;
        std::map< ::google::protobuf::Message *, int>::const_iterator itMap = msgs.begin();
        for (; itMap != msgs.end(); itMap++)
        {
            tb_online* t = dynamic_cast<tb_online *>(itMap->first);
            if (NULL == t)
            {
                cout << "ERROR: msgs[" << itMap->first << "] not tb_online type." << endl;
                return -1;
            }

                        cout << "---------- receive a response----------:" << itMap->second << endl;
            cout << "openid=" << t->openid() << endl;
                cout << "tconndid=" << t->tconndid() << endl;
                cout << "timekey=" << t->timekey() << endl;
                cout << "gamesvrid=" << t->gamesvrid() << endl;
                        cout << "logintime=" << t->logintime() << endl;
                for (int32_t i = 0; i < t->lockid_size();i++)
                {
                        cout << "lockid[" << i << "]=" << t->lockid(i) << endl;
                }
                        tb_online_pay_info pay = t->pay();
                        cout << "pay total_money=" << pay.total_money() << "; pay_times=" << pay.pay_times() << endl;

                        std::string version;
                        int iRet = g_stAsyncApi.GetMessageOption(*t, NS_TCAPLUS_PROTOBUF_API::MESSAGE_OPTION_DATA_VERSION, &version);
                        cout << "after GetMessageOption iRet= [" << iRet << "] version:" << version.c_str() << " msg:" << t << endl;
        }

        return 0;
    }

        int OnRecv(::google::protobuf::Message *msg, const std::set<std::string> &dottedpaths, const std::set<std::string> &failedpaths)
        {
        cout << "OnRecv" << endl;
                tb_online* t = dynamic_cast<tb_online *>(msg);
                if (NULL == t)
                {
                        cout << "ERROR: msg not tb_online type." << endl;
                        return -1;
                }

                cout << "---------- receive a response----------:" << endl;
                cout << "openid=" << t->openid() << endl;
                cout << "tconndid=" << t->tconndid() << endl;
                cout << "timekey=" << t->timekey() << endl;
                cout << "gamesvrid=" << t->gamesvrid() << endl;
                cout << "logintime=" << t->logintime() << endl;
                for (int32_t i = 0; i < t->lockid_size();i++)
                {
                        cout << "lockid[" << i << "]=" << t->lockid(i) << endl;
                }
                tb_online_pay_info pay = t->pay();
                cout << "pay total_money=" << pay.total_money() << "; pay_times=" << pay.pay_times() << endl;

                std::string version;
                int iRet = g_stAsyncApi.GetMessageOption(*t, NS_TCAPLUS_PROTOBUF_API::MESSAGE_OPTION_DATA_VERSION, &version);
                cout << "after GetMessageOption iRet= [" << iRet << "] version:" << version.c_str() << " msg:" << t << endl;

                return 0; 
        }

    int OnError(const std::vector< ::google::protobuf::Message *> &msgs, int errorcode)
    {
        cout << "OnError[" << msgs.size() << endl;
        for (size_t idx = 0; idx < msgs.size(); idx++)
        {
            tb_online* t = dynamic_cast<tb_online *>(msgs[idx]);
            if (NULL == t)
            {
                cout << "ERROR: msgs[" << idx << "] not tb_online type." << endl;
                return -1;
            }

            if (TcapErrCode::TXHDB_ERR_RECORD_NOT_EXIST == errorcode)
            {
                cout << "ERROR: openid= " << t->openid() << ", record not exists" << endl;
            }
            else if (TcapErrCode::API_ERR_NO_MORE_RECORD == errorcode)
            {
                cout << "NO MORE RECORDS, FINISH" << endl;
            }
            else
            {
                cout << "ERROR: openid = [" << t->openid() << "] failed:"  << errorcode << endl;        
            }
        }

        return 0;
    }

    int OnTimeout(const std::vector< ::google::protobuf::Message *> &msgs)
    {
        cout << "OnTimeout[" << msgs.size() << endl;
        for (size_t idx = 0; idx < msgs.size(); idx++)
        {
            tb_online* t = dynamic_cast<tb_online *>(msgs[idx]);
            if (NULL == t)
            {
                cout << "TIMEOUT: msgs[" << idx << "] not tb_online type!" << endl;
                return -1;
            }

            cout << "TIMEOUT: openid = [" << t->openid() << "] timeout" << endl;
        }

        return 0;
    }

    int OnFinish(const NS_TCAPLUS_PROTOBUF_API::MsgParam &param) 
    {
        g_dwTotalRevNum++;
        cout << "OnFinish: " << param.m_nOperation << " req: " << param.m_vecMsgs.size() << endl;
        return 0;
    }
};

4.1.4 发送请求(代码路径:examples/tcaplus/C++_pb2_asyncmode_simpletable/SingleOperation/batchget/main.cpp)

使用客户端发送请求

void SendBatchGetRequest(struct schedule * S, void* arg)
{
        static tb_online t1, t2;
        t1.set_openid(1);
        t1.set_tconndid(1);
        t1.set_timekey("test_tcaplus_1");

        t2.set_openid(2);
        t2.set_tconndid(2);
        t2.set_timekey("test_tcaplus_2");

        std::vector< ::google::protobuf::Message * > mapMsgs;
        mapMsgs.push_back(&t1);
        mapMsgs.push_back(&t2);

        static CommonCallback cb;

        int32_t iRet = g_stAsyncApi.BatchGet(&mapMsgs, &cb);
        if (iRet != TcapErrCode::GEN_ERR_SUC)
        {
                cout << "BatchGet failed! iret: " << iRet << endl;
        }
}

4.1.5 example异步框架(代码路径:examples/tcaplus/C++_common_for_pb/common.h)

通过实现回调函数的三个函数指针,proc主框架会调用相应的函数发送请求,接收响应和超时处理,该框架所有例子通用

int32_t main(int32_t argc, char* argv[])
{
    int32_t iRet = 0;
    //初始化
    iRet = InitAsync("tlogconf.xml");
    if (0 != iRet)
    {
        cout << "ERROR: Init failed, iRet: " << iRet << ", please check the tcaplus_pb.log for detail." << endl;
        return iRet;
    }
    //设置回调函数
    g_stPbCallbackFunctions.pfnSendRequest = SendBatchGetRequest;
    iRet = ProcAsync();
    if (0 != iRet)
    {
        cout << "ERROR: ProcAsync failed, iRet: " << iRet << ", please check the tcaplus_pb.log for detail." << endl;
        return iRet;
    }
    FinishAsync();
    return 0;
}

// 初始化pb api
int32_t InitAsync(const char* log_conf)
{
    int32_t iRet = 0;
    iRet = InitAsyncPbApi(log_conf);
    if (0 != iRet)
    {
        cout << "ERROR: InitCoroutinePbApi failed, iRet: " << iRet << "." << endl;
        return iRet;
    }
    return iRet;
}

//************************************************************************
// Method:    FinishAsync
// Returns:   
// Qualifier: 函数退出时处理逻辑
//*************************************************************************/
void  FinishAsync()
{
    cout << "g_stAsyncApi finish!" << endl;
    g_stAsyncApi.Fini();
    google::protobuf::ShutdownProtobufLibrary();
}

//************************************
// Method:    ProcAsync
// Returns:   int32_t
// Qualifier: 处理函数
//************************************
int32_t ProcAsync()
{
    int32_t iRet = 0;
    // 本例子中使用变量iSendRequestCount是控制发包的数量
    int32_t iSendRequestCount = 0;
    do 
    {
        if (iSendRequestCount < TOTAL_SEND_RECV_NUM)
        {
            if(NULL == g_stPbCallbackFunctions.pfnSendRequest)
            {
                cout << "ERROR: g_stPbCallbackFunctions.pfnSendRequest is NULL, so will finish example." << endl;
                break;
            }
            int32_t iUin = iSendRequestCount;
            g_stPbCallbackFunctions.pfnSendRequest(NULL, (void *)&iUin);
            iSendRequestCount++;
        }

        // 更新,接收回包
        g_stAsyncApi.UpdateNetwork();
        usleep(TCAPLUS_SLEEEP_US);
    } while (g_dwTotalRevNum != TOTAL_SEND_RECV_NUM);
    cout << "end mytest, please check the mytest.log for detail." << endl;
    return 0;
}

5. TcaplusAsyncPbApi主要接口的说明如下:

class TcaplusAsyncPbApi
{
public:
TcaplusAsyncPbApi();
virtual ~TcaplusAsyncPbApi();

    /**
    *    @brief 初始化操作
    *
    *    @param [IN] option   配置选项信息
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。
    */
    int Init(NS_TCAPLUS_PROTOBUF_API::ClientOptions& option);

    /**
    *    @brief 切换当前操作的区(表格组)
    *
    *    @param [IN] zone_id   区(表格组)ID
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。
    */
    int SelectZone(uint32_t zone_id); 

    /**
    *    @brief 事件循环,网络收发包,驱动整个API的运行
    *
    *    @retval >0   收到包
    *    @retval 0   正常。
    *    @retval <0   异常。
    */
    int UpdateNetwork();

    /**
    *  设置消息的选项
    *    item取值有如下情况:
    *    a).MESSAGE_OPTION_VERSION_CHECK = 1, API中设置记录版本对比
    *       option取值有  "1":启用版本对比(默认)
    *                     "2": 不启用版本对比,强制把MESSAGE_OPTION_DATA_VERSION指定的记录版本号写入到服务器中
    *                     "3":不检测记录版本号,将服务器端的版本号自增
    *    b).MESSAGE_OPTION_DATA_VERSION = 2,  API中设置记录版本功能
    *       option取值代表期望记录的版本号对应的字符串,比如"10",表示记录版本号为10
    *    c).MESSAGE_OPTION_ASYNC_ID = 3       API中设置设置消息的异步ID,异步ID是字符串形式的uint64_t数值
    *       option取值代表期望异步ID字符串,比如"13",表示异步ID为13
    *    d).MESSAGE_OPTION_MESSAGE_INVALID = 4       设置消息无效(在发送请求之后等消息还没回来之前生效)
    *       option取值代表期望异步ID字符串,比如"13",表示异步ID为13,如果没有设置异步ID保持为空
    *    e).MESSAGE_OPTION_MESSAGE_AUTO_RELEASE = 5,    API中设置设置消息的自动释放(异步模式生效)(不推荐)
    *    f).MESSAGE_OPTION_USER_BUFF = 6,           API中设置用户传入的自定义二进制数据, 最长1024Bytes
    *    g).MESSAGE_OPTION_CALLBACK_AUTO_RELEASE = 7,   API中设置回调的自动释放(异步模式生效)(不推荐)
    *    h).MESSAGE_OPTION_ENABLE_INCREASE_NOT_EXIST = 8, API中设置允许FieldInc操作不存在的记录时创建之,在默认值基础上自增,取值0不允许,取值1允许
    *    i).MESSAGE_OPTION_ENABLE_SET_NOT_EXIST = 9, API中设置允许FieldSet操作不存在的记录时创建之,在默认值基础上自增,取值0不允许,取值1允许
    *    j).MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS = 10, 用户显式设置请求执行成功时的响应标志,会覆盖API的默认配置
    *       option取值有    "0":表示只需返回操作执行成功与否
    *                       "1":表示返回与请求字段一致
    *                       "2":表示须返回变更记录的所有字段最新数据
    *                       "3":表示须返回变更记录的所有字段旧数据
    *    k).MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL = 11, 用户显式设置请求执行失败时的响应标志,会覆盖API的默认配置
    *       option取值有    "0":表示只需返回操作执行成功与否
    *                       "1":表示返回与请求字段一致
    *                       "2":表示须返回变更记录的所有字段最新数据
    *                       "3":表示须返回变更记录的所有字段旧数据                                              
    */
    int SetMessageOption(const ::google::protobuf::Message &msg, int32_t item, const std::string &option); // 为后续参数设置预留

    /**
    *  获取消息的选项
    *    item取值有如下情况:
    *    a).MESSAGE_OPTION_VERSION_CHECK = 1, 获取API中设定记录版本对比选项 
    *       option返回值有 "1":启用版本对比(默认)
    *                      "2": 不启用版本对比,强制把MESSAGE_OPTION_DATA_VERSION指定的记录版本号写入到服务器中
    *                      "3":不检测记录版本号,将服务器端的版本号自增
    *    b).MESSAGE_OPTION_DATA_VERSION = 2,  获取API中设置记录版本选项
    *       option返回值代表之前设置的记录的版本号对应的字符串,比如"10",表示记录版本号为10
    *    c).MESSAGE_OPTION_ASYNC_ID = 3       获取API中设置设置消息的异步ID选项,异步ID是字符串形式的uint64_t数值
    *       option返回值代表之前设置的异步ID字符串,比如"13",表示异步ID为13
    *    d).MESSAGE_OPTION_MESSAGE_INVALID = 4       获取设置消息无效选项
    *    e).MESSAGE_OPTION_MESSAGE_AUTO_RELEASE = 5,    获取设置设置消息的自动释放选项
    *    f).MESSAGE_OPTION_USER_BUFF = 6,           获取用户传入的自定义二进制数据
    *    g).MESSAGE_OPTION_CALLBACK_AUTO_RELEASE = 7, API中设置回调的自动释放(异步模式生效)
    *    h).MESSAGE_OPTION_ENABLE_INCREASE_NOT_EXIST = 8, API中设置允许FieldInc操作不存在的记录时创建之,在默认值基础上自增,取值0不允许,取值1允许
    *    i).MESSAGE_OPTION_ENABLE_SET_NOT_EXIST = 9, API中设置允许FieldSet操作不存在的记录时创建之,在默认值基础上自增,取值0不允许,取值1允许
    *    j).MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS = 10, 获取用户显式设置或API默认配置的请求执行成功时的响应标志
    *       option取值有    "0":表示只需返回操作执行成功与否
    *                       "1":表示返回与请求字段一致
    *                       "2":表示须返回变更记录的所有字段最新数据
    *                       "3":表示须返回变更记录的所有字段旧数据
    *    k).MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL = 11, 获取用户显式设置或API默认配置的请求执行失败时的响应标志
    *       option取值有    "0":表示只需返回操作执行成功与否
    *                       "1":表示返回与请求字段一致
    *                       "2":表示须返回变更记录的所有字段最新数据
    *                       "3":表示须返回变更记录的所有字段旧数据   
    */
    int GetMessageOption(const ::google::protobuf::Message &msg, int32_t item, std::string *option); // 为后续参数设置预留, 例如或取记录的version

    /**
    *  获取消息的版本号
    * > 0 success else 获取版本号失败,可能响应消息中没有版本号,需要设置resultflag
    * 
    */
    int32_t GetMessageVersion(const ::google::protobuf::Message &msg);

    /**
    *  删除消息的选项
    *    item取值有如下情况:
    *    a).MESSAGE_OPTION_VERSION_CHECK = 1, 删除API中记录版本对比选项 
    *    b).MESSAGE_OPTION_DATA_VERSION = 2,  删除API中设置记录版本选项
    *    c).MESSAGE_OPTION_ASYNC_ID = 3       删除API中设置设置消息的异步ID选项
    *    d).MESSAGE_OPTION_MESSAGE_INVALID = 4       删除设置消息无效选项
    *    e).MESSAGE_OPTION_MESSAGE_AUTO_RELEASE = 5,    删除设置设置消息的自动释放选项
    *    f).MESSAGE_OPTION_USER_BUFF = 6,           获取用户传入的自定义二进制数据
    *    g).MESSAGE_OPTION_CALLBACK_AUTO_RELEASE = 7, API中设置回调的自动释放(异步模式生效)
    *    h).MESSAGE_OPTION_ENABLE_INCREASE_NOT_EXIST = 8, API中设置允许FieldInc操作不存在的记录时创建之,在默认值基础上自增,取值0不允许,取值1允许
    *    i).MESSAGE_OPTION_ENABLE_SET_NOT_EXIST = 9, API中设置允许FieldSet操作不存在的记录时创建之,在默认值基础上自增,取值0不允许,取值1允许
    */
    int DelMessageOption(const ::google::protobuf::Message &msg, int32_t item); // 为后续参数设置预留

    /**
    *    @brief 根据用户输入的msg中的key值,获取msg消息的字段值,并填充到msg中。
    *          
    *    @param [INOUT] msg   用户输入的key值,返回指定字段填到msg中
    *    @param [INOUT] cb    消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。
    */   
    int Get(::google::protobuf::Message *msg, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg中的key值,获取msg消息的字段值,并填充到msg中。
    *          
    *    @param [INOUT] msg   用户输入的key值,返回指定字段填到msg中
    *    @param [IN] condition 过滤条件
    *    @param [INOUT] cb    消息回调函数
    *    @retval COMMON_ERR_CONDITION_NOT_MATCHED  condition不满足
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。
    */   
    int Get(::google::protobuf::Message *msg, const std::string &condition, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的req中的index名称,msg值,offset以及limit,通过索引获取多个记录的值填充到res中的vec结构中,并返回总记录数以及剩余记录数。
    *          
    *    @param [INOUT] req   用户输入的req
    *    @param [INOUT] res   用户输入的res
    *    @param [INOUT] cb    消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。
    */   
    int Get(NS_TCAPLUS_PROTOBUF_API::IndexGetRequest& req, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的req中的index名称,msg值,offset以及limit,通过索引获取多个记录的值填充到res中的vec结构中,并返回总记录数以及剩余记录数。
    *          
    *    @param [INOUT] req   用户输入的req
    *    @param [INOUT] res   用户输入的res
    *    @param [INOUT] cb    消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。
    */   
    int Get(NS_TCAPLUS_PROTOBUF_API::GlobalIndexGetRequest& req, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msgs中的key值,批量获取msg消息的字段值,并填充到msgs中?
    *          
    *    @param [INOUT] msgs   用户输入的key值列表,返回指定字段填到msgs中
    *    @param [INOUT] cb    消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。至少有一个字段查询成功才会返回0。
    */
    int BatchGet(std::vector< ::google::protobuf::Message * > *msgs, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg删除记录,并默认将成功删除的记录通过cb中OnRecv方法的参数返回给用户。
    *           用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置删除失败时将已经存在的数据通过cb中OnError方法的参数返回。
    *               @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置删除成功或失败时不返回记录。
    *          
    *    @param [IN] msg        要删除的数据记录msg
    *    @param [INOUT] cb      消息回调函数
    *    @retval TXHDB_ERR_RECORD_NOT_EXIST  记录不存在
    *    @retval <0             失败,返回对应的错误码
    *    @retval =0             成功
    */   
    int Del(::google::protobuf::Message *msg, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg删除记录,并默认将成功删除的记录旧值通过cb中OnRecv方法的参数返回给用户。
    *           用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置删除失败时将已经存在的数据通过cb中OnError方法的参数返回。
    *               @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置删除成功或失败时不返回记录。
    *          
    *    @param [IN] msg        要删除的数据记录msg
    *    @param [IN] condition  过滤条件表达式,仅当条件满足,修改操作才会执行
    *                           当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
    *                           例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
    *                           例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
    *    @param [INOUT] cb      消息回调函数
    *    @retval TXHDB_ERR_RECORD_NOT_EXIST  记录不存在。
    *    @retval COMMON_ERR_CONDITION_NOT_MATCHED  condition不满足,不会删除记录。
    *    @retval <0             失败,返回对应的错误码。
    *    @retval =0             成功。
    */   
    int Del(::google::protobuf::Message *msg, const std::string &condition, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg插入或更新记录,如果记录存在则更新指定记录的值,否则插入指定记录,并默认将操作成功的记录通过cb中OnRecv方法的参数返回给用户。
    *           用户可以通过记录的version判断实际执行的是插入操作还是更新操作,version == 1 表示实际执行的是插入操作,version > 1 表示实际执行的是更新操作。
    *           用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "3")设置操作成功时将更新之前的数据通过cb中OnRecv方法的参数返回。
    *               @note:仅当实际执行的是更新操作(即回调函数中记录version大于1)时,才会返回更新之前的数据,否则OnRecv回调函数传入的是用户请求中的msg指针。
    *           用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置操作失败时将更新之前的数据通过cb中OnError方法的参数返回。
    *               @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置操作成功或失败时不返回记录。
    *          
    *    @param [INOUT] msg     要插入或更新的数据记录msg
    *    @param [INOUT] cb      消息回调函数
    *    @retval <0             失败,返回对应的错误码
    *    @retval =0             成功
    */
    int Set(::google::protobuf::Message *msg, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg插入或更新记录,如果记录存在则更新指定记录的值,否则插入指定记录,并默认将操作成功的记录通过cb中OnRecv方法的参数返回给用户。
    *           用户可以通过记录的version判断实际执行的是插入操作还是更新操作,version == 1 表示实际执行的是插入操作,version > 1 表示实际执行的是更新操作。
    *           用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "3")设置操作成功时将更新之前的数据通过cb中OnRecv方法的参数返回。
    *               @note:仅当实际执行的是更新操作(即回调函数中记录version大于1)时,才会返回更新之前的数据,否则OnRecv回调函数传入的是用户请求中的msg指针。
    *           用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置操作失败时将更新之前的数据通过cb中OnError方法的参数返回。
    *               @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置操作成功或失败时不返回记录。
    *          
    *    @param [INOUT] msg     要插入或更新的数据记录msg
    *    @param [IN] operation  在Set操作执行成功的基础上,再执行的附加操作。operation是对数组的操作表达式,即PUSH或POP操作。
    *                           PUSH表达式为PUSH <repeated-field>#[0|1|...|-1][<assign-expr>]
    *                           POP表达式为POP <repeated-field>#[<array-indexes>][condition-expr]
    *                           例如"PUSH lockid#[-1][$=2];",在数组尾部插入字段并赋值为2
    *                           例如"PUSH pay#[1][total_money=4.4,pay_times=4];",在下标为1的位置插入组合类型并对字段赋值
    *                           例如"POP lockid#[0-3][$<=3];",删除下标范围0到3的且满足条件lockid<=3的元素
    *    @param [IN] condition  过滤条件表达式,仅当条件满足,Set才会执行
    *                           当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
    *                           例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
    *                           例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
    *    @param [INOUT] cb      消息回调函数
    *    @retval COMMON_ERR_CONDITION_NOT_MATCHED  condition不满足,不更新记录。
    *    @retval <0             失败,返回对应的错误码。
    *    @retval =0             成功。
    */
    int Set(::google::protobuf::Message *msg, const std::string &operation, const std::string &condition, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg插入记录,并默认将插入成功的记录通过cb中OnRecv方法的参数返回给用户,如果key存在则报错退出。
    *           用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置插入失败时将已经存在的数据通过cb中OnError方法的参数返回。
    *               @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_RECORD_EXIST等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置插入成功或失败时不返回记录。
    *          
    *    @param [INOUT] msg     要插入的数据记录msg
    *    @param [INOUT] cb      消息回调函数
    *    @retval <0             失败,返回对应的错误码
    *    @retval =0             成功
    */   
    int Add(::google::protobuf::Message *msg, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg中的key值和values增量值,和dottedpaths指定的字段名称,增加msg指定字段的值。字段为数值型变量。
    *    @param [INOUT] msg   数据记录msg,包含用户输入的key值,返回增量字段的结果值更新到msg中
    *    @param [IN] dottedpaths 字段名称的点分嵌套字符串集
    *    @param [INOUT] cb    消息回调函数
    *    @retval TXHDB_ERR_RECORD_NOT_EXIST  记录不存在。
    *    @retval <0   失败,返回对应的错误码。表示没有任何字段更新。
    *    @retval 0    成功。全部字段更新成功。
    */
    int FieldInc(const std::set<std::string> &dottedpaths, ::google::protobuf::Message *msg, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg中的key值和values增量值,和dottedpaths指定的字段名称,增加指定字段的值。字段为数值型变量
    *    @param [INOUT] msg   用户输入的key值,返回增量字段的结果值更新到msg
    *    @param [IN] dottedpaths 字段名称的点分嵌套字符串
    *    @param [IN] lowerLimitDottedpaths 需要指定下界的字段名称的点分嵌套字符串,若为empty则不设置下界
    *    @param [IN] lowerLimit 需要指定的字段的下界值,若为NULL则不设置下界
    *    @param [IN] upperLimitDottedpaths 需要指定上界的字段名称的点分嵌套字符串,若为empty则不设置上界
    *    @param [IN] upperLimit 需要指定的字段的上界值,若为NULL则不设置上界
    *    @param [INOUT] cb    消息回调函数
    *    @retval TXHDB_ERR_RECORD_NOT_EXIST  记录不存在。
    *    @retval <0   失败,返回对应的错误码。表示没有任何字段更新。
    *    @retval 0    成功。全部字段更新成
    */
    int FieldInc(const std::set<std::string> &dottedpaths, 
                 ::google::protobuf::Message *msg, 
                 const std::set<std::string> &lowerLimitDottedpaths, 
                 ::google::protobuf::Message *lowerLimit,
                 const std::set<std::string> &upperLimitDottedpaths,
                 ::google::protobuf::Message *upperLimit,
                 TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg中的key值和values增量值,和dottedpaths指定的字段名称,增加msg指定字段的值。字段为数值型变量。
    *    @param [INOUT] msg   数据记录msg,包含用户输入的key值,返回增量字段的结果值更新到msg中
    *    @param [IN] dottedpaths 字段名称的点分嵌套字符串集
    *    @param [IN] operation 在FieldInc操作执行成功的基础上,再执行的附加操作。operation是对数组的操作表达式,即PUSH或POP操作
    *                           PUSH表达式为PUSH <repeated-field>#[0|1|...|-1][<assign-expr>]
    *                           POP表达式为POP <repeated-field>#[<array-indexes>][condition-expr]
    *                           例如"PUSH lockid#[-1][$=2];",在数组尾部插入字段并赋值为2
    *                           例如"PUSH pay#[1][total_money=4.4,pay_times=4];",在下标为1的位置插入组合类型并对字段赋值
    *                           例如"POP lockid#[0-3][$<=3];",删除下标范围0到3的且满足条件lockid<=3的元素
    *    @param [IN] condition  过滤条件表达式,仅当条件满足,修改操作才会执行
    *                           当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
    *                           例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
    *                           例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
    *    @param [INOUT] cb    消息回调函数
    *    @retval TXHDB_ERR_RECORD_NOT_EXIST  记录不存在。
    *    @retval COMMON_ERR_CONDITION_NOT_MATCHED  condition不满足,没有任何字段更新。
    *    @retval <0   失败,返回对应的错误码。表示没有任何字段更新。
    *    @retval 0    成功。全部字段更新成功。
    */
    int FieldInc(const std::set<std::string> &dottedpaths, ::google::protobuf::Message *msg, 
                 const std::string &operation, const std::string &condition, 
                 TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg中的key值和values增量值,和dottedpaths指定的字段名称,增加指定字段的值。字段为数值型变量
    *    @param [INOUT] msg   用户输入的key值,返回增量字段的结果值更新到msg
    *    @param [IN] dottedpaths 字段名称的点分嵌套字符串
    *    @param [IN] lowerLimitDottedpaths 需要指定下界的字段名称的点分嵌套字符串,若为empty则不设置下界
    *    @param [IN] lowerLimit 需要指定的字段的下界值,若为NULL则不设置下界
    *    @param [IN] upperLimitDottedpaths 需要指定上界的字段名称的点分嵌套字符串,若为empty则不设置上界
    *    @param [IN] upperLimit 需要指定的字段的上界值,若为NULL则不设置上界
    *    @param [IN] operation 在FieldInc操作执行成功的基础上,再执行的附加操作。operation是对数组的操作表达式,即PUSH或POP操作
    *                           PUSH表达式为PUSH <repeated-field>#[0|1|...|-1][<assign-expr>]
    *                           POP表达式为POP <repeated-field>#[<array-indexes>][condition-expr]
    *                           例如"PUSH lockid#[-1][$=2];",在数组尾部插入字段并赋值为2
    *                           例如"PUSH pay#[1][total_money=4.4,pay_times=4];",在下标为1的位置插入组合类型并对字段赋值
    *                           例如"POP lockid#[0-3][$<=3];",删除下标范围0到3的且满足条件lockid<=3的元素
    *    @param [IN] condition  过滤条件表达式,仅当条件满足,修改操作才会执行
    *                           当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
    *                           例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
    *                           例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
    *    @param [INOUT] cb    消息回调函数
    *    @retval TXHDB_ERR_RECORD_NOT_EXIST  记录不存在。
    *    @retval COMMON_ERR_CONDITION_NOT_MATCHED  condition不满足,没有任何字段更新。
    *    @retval <0   失败,返回对应的错误码。表示没有任何字段更新。
    *    @retval 0    成功。全部字段更新成
    */
    int FieldInc(const std::set<std::string> &dottedpaths, 
                 ::google::protobuf::Message *msg, 
                 const std::set<std::string> &lowerLimitDottedpaths, 
                 ::google::protobuf::Message *lowerLimit,
                 const std::set<std::string> &upperLimitDottedpaths,
                 ::google::protobuf::Message *upperLimit, 
                 const std::string &operation,
                 const std::string &condition,
                 TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg中的key值,和dottedpaths指定的字段名称,更新msg指定字段的值。服务端不存在的值会追加进去。
    *          
    *    @param [IN] msg   数据记录msg,包含用户输入的key值,返回指定字段填到msg中
    *    @param [IN] dottedpaths 字段名称的点分嵌套字符串集
    *    @retval TXHDB_ERR_RECORD_NOT_EXIST  记录不存在。
    *    @retval <0   失败,返回对应的错误码。表示没有任何字段更新。
    *    @retval 0    成功。全部字段更新成功。
    */
    int FieldSet(const std::set<std::string> &dottedpaths, ::google::protobuf::Message *msg, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg中的key值,和dottedpaths指定的字段名称,更新msg指定字段的值。服务端不存在的值会追加进去。
    *          
    *    @param [IN] msg   数据记录msg,包含用户输入的key值,返回指定字段填到msg中
    *    @param [IN] dottedpaths 字段名称的点分嵌套字符串集
    *    @param [IN] operation 在FieldSet操作执行成功的基础上,再执行的附加操作。operation是对数组的操作表达式,即PUSH或POP操作
    *                           PUSH表达式为PUSH <repeated-field>#[0|1|...|-1][<assign-expr>]
    *                           POP表达式为POP <repeated-field>#[<array-indexes>][condition-expr]
    *                           例如"PUSH lockid#[-1][$=2];",在数组尾部插入字段并赋值为2
    *                           例如"PUSH pay#[1][total_money=4.4,pay_times=4];",在下标为1的位置插入组合类型并对字段赋值
    *                           例如"POP lockid#[0-3][$<=3];",删除下标范围0到3的且满足条件lockid<=3的元素
    *    @param [IN] condition 过滤条件,仅当该条件满足时才会执行FieldSet操作。
    *                           当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
    *                           例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
    *                           例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
    *    @retval TXHDB_ERR_RECORD_NOT_EXIST  记录不存在。
    *    @retval COMMON_ERR_CONDITION_NOT_MATCHED  condition不满足,没有任何字段更新。
    *    @retval <0   失败,返回对应的错误码。表示没有任何字段更新。
    *    @retval 0    成功。全部字段更新成功。
    */
    int FieldSet(const std::set<std::string> &dottedpaths, ::google::protobuf::Message *msg, 
                 const std::string &operation, const std::string &condition, 
                 TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg中的key值,和dottedpaths指定的字段名称,获取指定字段的值,并填充到msg中。
    *          
    *    @param [IN] dottedpaths 字段名称的点分嵌套字符串集
    *    @param [INOUT] msg   数据记录msg,包含用户输入的key值,返回指定字段填到msg中
    *    @param [IN] dottedpaths 字段名称的点分嵌套字符串集
    *    @param [INOUT] cb    消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。至少有一个字段查询成功才会返回0。
    */
    int FieldGet(const std::set<std::string> &dottedpaths, ::google::protobuf::Message *msg, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg中的key值,和dottedpaths指定的字段名称,获取指定字段的值,并填充到msg中。
    *          
    *    @param [IN] dottedpaths 字段名称的点分嵌套字符串集
    *    @param [INOUT] msg   数据记录msg,包含用户输入的key值,返回指定字段填到msg中
    *    @param [IN] condition 记录的过滤条件
    *    @param [INOUT] cb    消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。至少有一个字段查询成功才会返回0。
    */
    int FieldGet(const std::set<std::string> &dottedpaths, ::google::protobuf::Message *msg, const std::string &condition, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入req中的的msg中的key值,和dottedpaths指定的字段名称,获取指定字段的值,并填充到cb中。
    *          
    *    @param [INOUT] req   数据记录msg,包含用户输入的key值,返回指定字段填到msg中
    *    @param [OUT] cb 返回查找失败的字段名称的点分嵌套字符串集
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。至少有一个字段查询成功才会返回0。
    */
    int FieldGet(NS_TCAPLUS_PROTOBUF_API::BatchFieldGetRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 通过query描述的表达式在记录中进行查询,返回记录的局部数据内容,仅支持数组内的查询
    *          
    *    @param [INOUT] msg     数据记录msg,作为输入时包含主键的值,作为输出时包含响应返回的数据
    *                           注意,返回的msg会和输入的msg合并,即接口内部调用Message::MergeFrom
    *    @param [IN] query      查询语句,语法:
    *                           query ::=
    *                               GET repeated_field [ #\[ index_range [, index_range]* \] ] [ \[ inner_condition \] ]
    *                           index_range ::=
    *                               number [ - number ]
    *                           其中number的范围时 -1 ~ INT_MAX,-1表示数组最后一个位置
    *                           例如,GET mail_list #[1-9][domain=="qq.com"]
    *    @param [IN] queryOption 查询选项设置,见NS_TCAPLUS_PROTOBUF_API::TcaplusQueryOption
    *    @param [IN] condition  记录级别的过滤条件,仅当该条件满足时才会执行query操作,== ""则不作过滤。
    *    @param [INOUT] cb      消息回调函数
    *    @retval TXHDB_ERR_RECORD_NOT_EXIST  记录不存在。
    *    @retval COMMON_ERR_CONDITION_NOT_MATCHED  condition不满足。
    *    @retval <0   失败,返回对应的错误码。表示没有任何字段更新。
    *    @retval 0    成功。全部字段更新成功。
    */
    int Query(::google::protobuf::Message *msg, const std::string &query, int queryOption,
        const std::string &condition, TcaplusPbCallback *cb);

    /**
    *    @brief 通过operation描述的表达式执行对数组的操作,并默认将更新成功的记录通过cb中OnRecv方法的参数返回给用户。
    *           用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "3")设置更新成功时将更新之前的数据通过cb中OnRecv方法的参数返回。
    *           用户也可以通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置更新失败时将更新之前的数据通过cb中OnError方法的参数返回。
    *               @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回更新之前的数据,否则OnError回调函数传入的是用户请求中的msg指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置更新成功或失败时不返回记录。
    *          
    *    @param [INOUT] msg     数据记录msg,包含用户输入的key值
    *    @param [IN] operation  对数组的操作表达式,即PUSH或POP操作
    *                           PUSH表达式为PUSH <repeated-field>#[0|1|...|-1][<assign-expr>]
    *                           POP表达式为POP <repeated-field>#[<array-indexes>][condition-expr]
    *                           例如"PUSH lockid#[-1][$=2];",在数组尾部插入字段并赋值为2
    *                           例如"PUSH pay#[1][total_money=4.4,pay_times=4];",在下标为1的位置插入组合类型并对字段赋值
    *                           例如"POP lockid#[0-3][$<=3];",删除下标范围0到3的且满足条件lockid<=3的元素
    *    @param [IN] condition  过滤条件,仅当该条件满足时才会执行UpdateItem操作
    *                           当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
    *                           例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
    *                           例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
    *    @param [INOUT] cb      消息回调函数
    *    @retval TXHDB_ERR_RECORD_NOT_EXIST  记录不存在。
    *    @retval COMMON_ERR_CONDITION_NOT_MATCHED  condition不满足,没有任何字段更新。
    *    @retval <0             失败,返回对应的错误码。表示没有任何字段更新。
    *    @retval =0             成功。全部字段更新成功。
    */
    int UpdateItem(::google::protobuf::Message *msg, const std::string &operation, const std::string &condition, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入req中的的msg中的key值,和dottedpaths指定的字段名称,获取List表中全部记录指定字段的值,并填充到cb中。
    *          
    *    @param [INOUT] req   数据记录msg,包含用户输入的key值,返回指定字段填到msg中
    *    @param [OUT] cb 返回查找失败的字段名称的点分嵌套字符串集
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。至少有一个字段查询成功才会返回0。
    */
    int ListGetAll(NS_TCAPLUS_PROTOBUF_API::ListGetAllRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入req中的msg的key值,删除List表中该key值下对应index的记录,并默认将成功删除的记录填充到cb中,ListBatchDeleteResponse.m_mapMsg的key为成功删除的记录index,value为msg指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")设置删除成功时不返回数据,如此,则cb中ListBatchDeleteResponse.m_mapMsg的key为成功删除的记录index,value均为空指针。
    *          
    *    @param [INOUT] req     要删除的数据记录msg
    *    @param [OUT] cb        其中的ListBatchDeleteResponse用于接收请求执行结果
    *    @retval <0             失败,返回对应的错误码
    *    @retval =0             成功,至少有一条记录删除成功才会返回0
    */
    int ListBatchDel(NS_TCAPLUS_PROTOBUF_API::ListBatchDeleteRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入req中的msg,在List表中指定位置后面添加记录,并默认将成功插入的记录的下标填充到ListAddAfterResponse.m_nElemIndex,ListAddAfterResponse.m_mapMsg为空。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "2")设置插入成功时返回最新数据,如此,则ListAddAfterResponse.m_mapMsg的key为成功插入或被淘汰记录的index,value为对应记录的msg指针。
    *          
    *    @param [INOUT] req     要插入的数据记录msg
    *    @param [OUT] cb        其中的ListAddAfterResponse用于接收请求执行结果
    *    @retval <0             失败,返回对应的错误码
    *    @retval =0             成功
    */
    int ListAddAfter(NS_TCAPLUS_PROTOBUF_API::ListAddAfterRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入req中的msg,在List表中指定位置更新记录,并默认将更新成功后的记录填充到cb中,ListReplaceResponse.m_pMsg为更新后记录的指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "3")设置更新成功时返回操作前的记录,如此,则cb中ListReplaceResponse.m_pMsg为更新前记录的指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置更新失败时返回操作前的记录,如此,则cb中ListReplaceResponse.m_pMsg为空指针,OnError回调函数传入操作前记录的指针。
    *               @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置更新成功或失败时不返回记录,如此,则ListReplaceResponse.m_pMsg为空。
    *          
    *    @param [INOUT] req     要更新的数据记录msg以及index
    *    @param [OUT] cb        其中的ListReplaceResponse用于接收请求执行结果
    *    @retval <0             失败,返回对应的错误码
    *    @retval =0             成功
    */
    int ListReplace(NS_TCAPLUS_PROTOBUF_API::ListReplaceRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 通过operation描述的表达式执行对数组的操作,并默认将更新成功后的记录填充到cb中,ListUpdateItemResponse.m_pMsg为更新后记录的指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "3")设置更新成功时返回操作前的记录,如此,则cb中ListUpdateItemResponse.m_pMsg为更新前记录的指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置更新失败时返回操作前的记录,如此,则cb中ListUpdateItemResponse.m_pMsg为空指针,OnError回调函数传入操作前记录的指针。
    *               @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置更新成功或失败时不返回记录,如此,则ListUpdateItemResponse.m_pMsg为空。
    *          
    *    @param [IN] req        操作请求,包含msg、操作表达式、条件过滤表达式
    *    @param [OUT] cb        其中的ListUpdateItemResponse用于接收请求执行结果
    *    @retval <0             失败,返回对应的错误码
    *    @retval =0             成功
    */
    int ListUpdateItem(NS_TCAPLUS_PROTOBUF_API::ListUpdateItemRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 通过query描述的表达式在记录中进行查询,返回记录的局部数据内容,仅支持数组内的查询
    *          
    *    @param [INOUT] msg     数据记录msg,作为输入时包含主键的值,作为输出时包含响应返回的数据
    *    @param [IN]  req 查询请求,包含msg、查询表达式、条件过滤表达式
    *    @param [OUT] cb 回调
    *    @retval TXHDB_ERR_RECORD_NOT_EXIST  记录不存在。
    *    @retval COMMON_ERR_CONDITION_NOT_MATCHED  condition不满足。
    *    @retval <0   失败,返回对应的错误码。表示没有任何字段更新。
    *    @retval 0    成功。全部字段更新成功。
    */
    int ListQuery(NS_TCAPLUS_PROTOBUF_API::ListQueryRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入req中的的msg中的key值,删除List表中指定key的所有记录,并填充到cb中。
    *          
    *    @param [INOUT] req   数据记录msg,包含用户输入的key值,返回指定字段填到msg中
    *    @param [OUT] cb 返回查找失败的字段名称的点分嵌套字符串集
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。至少有一个字段查询成功才会返回0。
    */
    int ListDelAll(NS_TCAPLUS_PROTOBUF_API::ListDelAllRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入req中的的msg中的key值,在List表中指定key的指定下标记录,并填充到cb中。
    *          
    *    @param [INOUT] req   数据记录msg,包含用户输入的key值,返回指定字段填到msg中
    *    @param [OUT] cb 返回查找失败的字段名称的点分嵌套字符串集
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。至少有一个字段查询成功才会返回0。
    */
    int ListGet(NS_TCAPLUS_PROTOBUF_API::ListGetRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入req中的msg,在List表中指定位置删除记录,并默认在删除成功时将删除之前的记录填充到cb中,ListDeleteResponse.m_nElemIndex为成功删除的记录index,m_pMsg为msg指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "3")设置删除失败时返回操作前的记录,如此,则cb中ListDeleteResponse.m_pMsg为空指针,OnError回调函数传入操作前记录的指针。
    *               @note:只有响应结果为TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION等表示操作前记录已经存在的错误码时,才会返回已经存在的数据,否则OnError回调函数传入的是用户请求中的msg指针。
    *           用户也可通过SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_SUCCESS, "0")或SetMessageOption(msg, MESSAGE_OPTION_RESULT_FLAG_FOR_FAIL, "0")设置删除成功或失败时不返回记录,如此,则ListDeleteResponse.m_pMsg始终为空。
    *          
    *    @param [INOUT] req     要删除的数据记录msg以及index
    *    @param [OUT] cb        其中的ListDeleteResponse用于接收请求执行结果
    *    @retval <0             失败,返回对应的错误码
    *    @retval =0             成功
    */
    int ListDel(NS_TCAPLUS_PROTOBUF_API::ListDeleteRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入req中指定信息,遍历List表所有记录,并填充到cb中。
    *          
    *    @param [INOUT] req   数据记录msg,包含用户输入的key值,返回指定字段填到msg中
    *    @param [OUT] cb 返回查找失败的字段名称的点分嵌套字符串集
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。至少有一个字段查询成功才会返回0。
    */
    int ListTraverse(NS_TCAPLUS_PROTOBUF_API::ListTraverseRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 遍历表,消息会填充到msg中。
    *          
    *    @param [INOUT] msg   返回指定字段填到msg中
    *    @param [IN] condition  过滤条件
    *    @param [INOUT] cb   回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    遍历成功完成。
    */
    int Traverse(::google::protobuf::Message *msg, const std::string &condition, TcaplusPbCallback *cb);

    /**
    *    @brief 遍历表,消息会填充到msg中。
    *          
    *    @param [INOUT] msg   返回指定字段填到msg中
    *    @param [INOUT] cb   回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    遍历成功完成。
    */
    int Traverse(::google::protobuf::Message *msg, TcaplusPbCallback *cb);

    /**
    *    @brief 遍历表,消息会填充到msg中。
    *          
    *    @param [INOUT] msg   返回指定字段填到msg中
    *    @param [IN] condition  过滤条件
    *    @param [IN] dottedpaths  字段名称的点分嵌套字符串集
    *    @param [INOUT] cb   回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    遍历成功完成。
    */
    int Traverse(::google::protobuf::Message *msg, const std::set<std::string> &dottedpaths, const std::string &condition, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入vecReq中的每个msg中的key值,设置对应记录的TTL值。
    *          
    *    @param [IN] vecReq 输入的每个msg和对应设置的TTL值,其中SetTTLRequest的msg包含用户输入的key值
    *    @param [IN] cb 消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。
    */
    int SetTTL(const std::vector<NS_TCAPLUS_PROTOBUF_API::SetTTLRequest> &vecReq, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入vecReq中的msg中的key值,设置对应记录的TTL值。
    *          
    *    @param [IN] vecReq 输入的msg和对应设置的TTL值,其中SetTTLRequest的msg包含用户输入的key值
    *    @param [IN] cb 消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。
    */
    int SetTTL(const NS_TCAPLUS_PROTOBUF_API::SetTTLRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的每个msg的key值,获取对应记录的TTL值。
    *          
    *    @param [IN] msgs 输入的msg列表,每个msg包含用户输入的key值
    *    @param [IN] cb 消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。
    */   
    int GetTTL(const std::vector< ::google::protobuf::Message* > &msgs, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg的key值,获取对应记录的TTL值。
    *          
    *    @param [IN] msgs 输入的msg,包含用户输入的key值
    *    @param [IN] cb 消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。
    */  
    int GetTTL(::google::protobuf::Message *msg, TcaplusPbCallback *cb);

    /**
    *    @brief 返回当前待处理消息数
    *
    *    @retval 当前待处理消息计数
    */
    size_t GetPendingCount() { return m_mapStatus.size();}


    /**
    *    @brief 注册加密套件
    *          
    *    @param [IN] suite   加密套件
    *    @retval <0   失败,注册失败。
    *    @retval 0    创建一个协程并启动。
    */ 
    int RegisterCipherSuite(CipherSuite *suite);

    /**
    *    @brief 注销加密套件
    *          
    *    @param [IN] suite   加密套件
    *    @retval <0   失败,注销失败。
    *    @retval 0    成功,注销成功
    */
    int UnregisterCipherSuite(CipherSuite *suite);

    /**
    *    @brief 返回当前表中的记录数
    *
    *    @param [IN] table_name   表名
    *    @param [OUT] cb   返回记录数的回调
    *    @retval <0   失败
    *    @retval 0    成功
    */
    int GetCount(const char* table_name, TcaplusPbCallback *cb); 

    /**
    *    @brief 根据用户输入的msg中的索引值,删除对应的记录。
    *          
    *    @param [INOUT] req   用户输入的req
    *    @param [INOUT] res   用户输入的res
    *    @param [INOUT] cb    消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。
    */   
    int Del(NS_TCAPLUS_PROTOBUF_API::IndexDeleteRequest& req, TcaplusPbCallback *cb);


    /**
    *    @brief 根据用户输入的msg更新记录,默认将操作成功的记录通过cb中OnRecv方法的参数返回给用户。
    *    
    *    @param [INOUT] msg     要更新的数据记录msg
    *    @param [INOUT] cb      消息回调函数
    *    @retval COMMON_ERR_CONDITION_NOT_MATCHED  condition不满足,不更新记录。
    *    @retval <0             失败,返回对应的错误码。
    *    @retval =0             成功。
    */
    int Update(::google::protobuf::Message *msg, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msg更新记录,默认将操作成功的记录通过cb中OnRecv方法的参数返回给用户。
    *    
    *    @param [INOUT] msg     要更新的数据记录msg
    *    @param [IN] operation  在Update操作执行成功的基础上,再执行的附加操作。operation是对数组的操作表达式,即PUSH或POP操作。
    *                           PUSH表达式为PUSH <repeated-field>#[0|1|...|-1][<assign-expr>]
    *                           POP表达式为POP <repeated-field>#[<array-indexes>][condition-expr]
    *                           例如"PUSH lockid#[-1][$=2];",在数组尾部插入字段并赋值为2
    *                           例如"PUSH pay#[1][total_money=4.4,pay_times=4];",在下标为1的位置插入组合类型并对字段赋值
    *                           例如"POP lockid#[0-3][$<=3];",删除下标范围0到3的且满足条件lockid<=3的元素
    *    @param [IN] condition  过滤条件表达式,仅当条件满足,Update才会执行
    *                           当前只支持contains条件过滤,表达式为<repeated-field> contains(<condition-expr>)
    *                           例如"a.b.c contains($>0)",其中a.b.c是基本类型,'$'即该field的值
    *                           例如"a.b.c contains(x>0 AND y>0)",其中a.b.c是组合类型,'x'即该组合类型中的基本字段的值
    *    @param [IN] resultFlag 设置数据的返回方式。
    *    @param [INOUT] cb      消息回调函数
    *    @retval COMMON_ERR_CONDITION_NOT_MATCHED  condition不满足,不更新记录。
    *    @retval <0             失败,返回对应的错误码。
    *    @retval =0             成功。
    */
    int Update(::google::protobuf::Message *msg, const std::string &operation, const std::string &condition, int resultFlag, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msgs,批量插入数据。
    *          
    *    @param [INOUT] msgs   用户输入的msgs列表。
    *    @param [IN] resultFlag 设置数据的返回方式。
    *    @param [INOUT] cb    消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。至少有一个字段查询成功才会返回0。
    */
    int BatchAdd(std::vector< ::google::protobuf::Message * > *msgs, int resultFlag, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msgs,批量删除数据。
    *          
    *    @param [INOUT] msgs   要删除的数据记录msgs列表。
    *    @param [IN] resultFlag 设置数据的返回方式。
    *    @param [INOUT] cb    消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。至少有一个字段查询成功才会返回0。
    */
    int BatchDelete(std::vector< ::google::protobuf::Message * > *msgs, int resultFlag, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msgs,批量更新数据。
    *          
    *    @param [INOUT] msgs   要更新的数据记录msgs列表。
    *    @param [IN] resultFlag 设置数据的返回方式。
    *    @param [INOUT] cb    消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。至少有一个字段查询成功才会返回0。
    */
    int BatchUpdate(std::vector< ::google::protobuf::Message * > *msgs, int resultFlag, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入的msgs,批量替换数据。
    *          
    *    @param [INOUT] msgs   要替换的数据记录msgs列表。
    *    @param [IN] resultFlag 设置数据的返回方式。
    *    @param [INOUT] cb    消息回调函数
    *    @retval <0   失败,返回对应的错误码。
    *    @retval 0    成功。至少有一个字段查询成功才会返回0。
    */
    int BatchSet(std::vector< ::google::protobuf::Message * > *msgs, int resultFlag, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入req中的msg的key值,获取List表中该key值下对应index的记录,并默认将成功的记录填充到cb中,ListBatchGetResponse.m_mapMsg的key为查询成功的记录index,value为msg指针。    *          
    *    @param [INOUT] req     要删除的数据记录msg
    *    @param [OUT] cb        其中的ListBatchGetResponse用于接收请求执行结果
    *    @retval <0             失败,返回对应的错误码
    *    @retval =0             成功,至少有一条记录查询成功才会返回0
    */
    int ListBatchGet(NS_TCAPLUS_PROTOBUF_API::ListBatchGetRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入req中的msgs向后或向前插入记录,并默认将成功的记录填充到cb中,ListBatchAddRequest.m_msgs的key为msg指针,value为插入方式(-2向前插入,-1向后插入); 
    *           ListBatchAddRequest.m_cShifFlag可以设置list表淘汰方式; ListBatchAddResponse.m_mapMsg的key为查询成功的记录index,value为msg指针。    *          
    *    @param [INOUT] req     要删除的数据记录msg
    *    @param [OUT] cb        其中的ListBatchAddResponse用于接收请求执行结果
    *    @retval <0             失败,返回对应的错误码
    *    @retval =0             成功,至少有一条记录插入成功才会返回0
    */
    int ListBatchAdd(NS_TCAPLUS_PROTOBUF_API::ListBatchAddRequest &req, TcaplusPbCallback *cb);

    /**
    *    @brief 根据用户输入req中的msgs,更新List表中该key值下对应index的记录,并默认将成功的记录填充到cb中,ListBatchUpdateResponse.m_mapMsg的key为更新成功的记录index,value为msg指针。    *          
    *    @param [INOUT] req     要更新的数据记录msg
    *    @param [OUT] cb        其中的ListBatchUpdateResponse用于接收请求执行结果
    *    @retval <0             失败,返回对应的错误码
    *    @retval =0             成功,至少有一条记录查询成功才会返回0
    */
    int ListBatchUpdate(NS_TCAPLUS_PROTOBUF_API::ListBatchUpdateRequest &req, TcaplusPbCallback *cb);


    /**
    *    @brief 与Init匹配的资源释放操作
    *
    */
    void Fini();
};

8. 常见问题

详见错误码含义和处理方法

8. 其它参考文档

[PB Generic表][Go SDK]批量查询多条数据接口说明

[PB Generic表][RESTFul API]批量查询多条数据部分字段值接口说明

results matching ""

    No results matching ""